// #include <windows.h>
// #include <iostream>
// #include <ctime>
// #include "opencv2/myopencv.hpp"
// #include "NuiApi.h"
// #include "KinectWrapper.h"
// #pragma comment(lib, "Kinect10.lib")
// 
// using namespace std;
// 
// const int WIDTH = 640;
// const int HEIGHT = 480;
// CvMat *depthFrame = NULL;
// CvMat *grayFrame = NULL;
// CvMat *colorFrame = NULL;
// HANDLE depthReadyEvent;
// HANDLE grayReadyEvent;
// HANDLE colorReadyEvent;
// 
// HANDLE depthHandledEvent;
// HANDLE grayHandledEvent;
// HANDLE colorHandledEvent;
// 
// HANDLE depthQuitEvent;
// HANDLE grayQuitEvent;
// HANDLE colorQuitEvent;
// 
// HANDLE depthColorHandledEvent;
// bool quit = false;
// bool saveDCData = false;
// bool saveGData = false;
// 
// DWORD WINAPI keepDepthData(void *pParam) {
// 	KinectDepthWrapper depthReader;
// 	FILE *dataFile = NULL;
// 	FILE *metaDataFile = NULL;
// 	int cnt = 0;
// 	SYSTEMTIME st;
// 
// 	dataFile = fopen("depth_data.dat", "wb");
// 	metaDataFile = fopen("depth_meta.txt", "w");
// 
// 	fprintf(metaDataFile, "#first line include width height. next line is ID CLOCK TIME and so on. the last line is total frame number.\n");
// 	fprintf(metaDataFile, "%d %d\n", WIDTH, HEIGHT);
// 	
// 	depthReader.init(WIDTH, HEIGHT);
// 
// 	SignalObjectAndWait(depthReadyEvent, depthHandledEvent, INFINITE, FALSE);
// 	while (!quit) {
// 		if (depthReader.retrieve(depthFrame)) {
// 			GetSystemTime(&st);
// 			int clk = clock();
// 			fwrite(depthFrame->data.s, sizeof(short), WIDTH*HEIGHT, dataFile);
// 			fprintf(metaDataFile, "%5d %9d   %02d/%02d %02d:%02d:%02d.%03d\n", cnt++, clk, 
// 				st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
// 
// 			SignalObjectAndWait(depthReadyEvent, depthHandledEvent, 1000, FALSE);
// 		}
// 		else {
// 			cout << "retrieve depth failed." << endl;
// 		}
// 	}
// 	fprintf(metaDataFile, "#total frames = %d.", cnt);
// 
// 	fclose(dataFile);
// 	fclose(metaDataFile);
// 	SetEvent(depthQuitEvent);
// 	return 0;
// }
// 
// CvCapture* capture;
// 
// DWORD WINAPI keepGrayData(void *pParam) {
// 	FILE *dataFile = NULL;
// 	FILE *metaDataFile = NULL;
// 	int cnt = 0;
// 	SYSTEMTIME st;
// 
// 	dataFile = fopen("gray_data.dat", "wb");
// 	metaDataFile = fopen("gray_meta.txt", "w");
// 
// 	fprintf(metaDataFile, "#first line include width height. next line is ID CLOCK TIME and so on. the last line is total frame number.\n");
// 	fprintf(metaDataFile, "%d %d\n", WIDTH, HEIGHT);
// 
// 	cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, WIDTH);
// 	cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, HEIGHT);
// 
// 	CvMat *frameMat = cvCreateMatHeader(HEIGHT, WIDTH, CV_8UC3);
// 	grayFrame = cvCreateMat(HEIGHT, WIDTH, CV_8UC1);
// 
// 	SignalObjectAndWait(grayReadyEvent, grayHandledEvent, INFINITE, FALSE);
// 	while (!quit) {
// 		IplImage* frame = cvQueryFrame(capture);
// 
// 		GetSystemTime(&st);
// 		int clk = clock();
// 
// 		cvGetMat(frame, frameMat);
// 		cvCvtColor(frameMat, grayFrame, CV_BGR2GRAY);
// 
// 		SignalObjectAndWait(grayReadyEvent, grayHandledEvent, 2000, FALSE);
// 
// 		if (saveGData) {
// 			saveGData = false;
// 			fwrite(grayFrame->data.ptr, sizeof(char), WIDTH*HEIGHT, dataFile);
// 			fprintf(metaDataFile, "%5d %9d   %02d/%02d %02d:%02d:%02d.%03d\n", cnt++, clk, 
// 				st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
// 		}
// 
// 	}
// 	fprintf(metaDataFile, "#total frames = %d.", cnt);
// 
// 	fclose(dataFile);
// 	fclose(metaDataFile);
// 
// 	cvReleaseCapture(&capture);
// 
// 	SetEvent(grayQuitEvent);
// 	return 0;
// }
// 
// DWORD WINAPI keepDepthColorData(void *pParam) {
// 	KinectDepthColorWrapper depthColorReader;
// 	FILE *dataFile = NULL;
// 	FILE *metaDataFile = NULL;
// 	FILE *colorDataFile = NULL;
// 	FILE *colorMetaDataFile = NULL;
// 	int cnt = 0;
// 	SYSTEMTIME st;
// 
// 	CvMat *map1 = cvCreateMat(HEIGHT, WIDTH, CV_32S);
// 	CvMat *map2 = cvCloneMat(map1);
// 
// 
// 	dataFile = fopen("depth_data.dat", "wb");
// 	metaDataFile = fopen("depth_meta.txt", "w");
// 	colorDataFile = fopen("color_data.dat", "wb");
// 	colorMetaDataFile = fopen("color_meta.txt", "w");
// 
// 	fprintf(metaDataFile, "#first line include width height. next line is ID CLOCK TIME and so on. the last line is total frame number.\n");
// 	fprintf(metaDataFile, "%d %d\n", WIDTH, HEIGHT);
// 	fprintf(colorMetaDataFile, "#first line include width height. next line is ID CLOCK TIME and so on. the last line is total frame number.\n");
// 	fprintf(colorMetaDataFile, "%d %d\n", WIDTH, HEIGHT);
// 
// 	depthColorReader.init(WIDTH, HEIGHT);
// 
// 	SetEvent(colorReadyEvent);
// 	SignalObjectAndWait(depthReadyEvent, depthColorHandledEvent, INFINITE, FALSE);
// 	
// 	while (!quit) {
// 		if (depthColorReader.retrieve(depthFrame, colorFrame)) {
// 
// 			GetSystemTime(&st);
// 			int clk = clock();
// 
// 			SetEvent(colorReadyEvent);
// 			SignalObjectAndWait(depthReadyEvent, depthColorHandledEvent, 2000, FALSE);
// 
// 			if (saveDCData) {
// 				saveDCData = false;
// 				fwrite(depthFrame->data.s, sizeof(short), WIDTH*HEIGHT, dataFile);
// 				fprintf(metaDataFile, "%5d %9d  %lld  %02d/%02d %02d:%02d:%02d.%03d\n", cnt, clk, depthColorReader.depthT,
// 					st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
// 				fwrite(colorFrame->data.ptr, sizeof(char), WIDTH*HEIGHT*3, colorDataFile);
// 				fprintf(colorMetaDataFile, "%5d %9d  %lld  %02d/%02d %02d:%02d:%02d.%03d\n", cnt++, clk, depthColorReader.colorT,
// 					st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
// 
// 
// 				char name[100];
// 				long x, y;
// 				for (int j=0; j<HEIGHT; ++j) {
// 					for (int k=0; k<WIDTH; ++k) {
// 						HRESULT hr = NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution(
// 							NUI_IMAGE_RESOLUTION_640x480,
// 							NUI_IMAGE_RESOLUTION_640x480,
// 							NULL,
// 							j,k,cvGetReal2D(depthFrame,j,k),
// 							&x,&y
// 							);
// 						cvSetReal2D(map1,j,k,x);
// 						cvSetReal2D(map2,j,k,y);
// 					}
// 				}
// 				sprintf(name, "dcmap1mat%d.xml", cnt);
// 				cvSave(name, map1);
// 				sprintf(name, "dcmap2mat%d.xml", cnt);
// 				cvSave(name, map2);
// 
// 			}
// 
// 		}
// 		else {
// 			cout << "retrieve depth failed." << endl;
// 		}
// 	}
// 	fprintf(metaDataFile, "#total frames = %d.", cnt);
// 	fprintf(colorMetaDataFile, "#total frames = %d.", cnt);
// 
// 	fclose(dataFile);
// 	fclose(metaDataFile);
// 	SetEvent(depthQuitEvent);
// 	fclose(colorDataFile);
// 	fclose(colorMetaDataFile);
// 	SetEvent(colorQuitEvent);
// 	return 0;
// }
// 
// void getDepthColorMapping(void) {
// 	long x,y;
// 	INuiSensor *m_pNuiSensor; 
// 	HRESULT hr = NuiCreateSensorByIndex(0, &m_pNuiSensor);
// 
// 	WCHAR *id = m_pNuiSensor->NuiDeviceConnectionId();
// 	hr = m_pNuiSensor->NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH | NUI_INITIALIZE_FLAG_USES_COLOR);
// 
// 	CvMat *img = NULL;
// 	char name[100];
// 	
// 	for (int i=1; i<=9; ++i) {
// 		sprintf(name, "gd%d.jpg", i);
// 		img = cvLoadImageM(name);
// 		CvMat *map1 = cvCreateMat(img->rows, img->cols, CV_32S);
// 		CvMat *map2 = cvCloneMat(map1);
// 		for (int j=0; j<img->rows; ++j) {
// 			for (int k=0; k<img->cols; ++k) {
// 				hr = NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution(
// 					NUI_IMAGE_RESOLUTION_640x480,
// 					NUI_IMAGE_RESOLUTION_640x480,
// 					NULL,
// 					j,k,cvGetReal2D(img,j,k),
// 					&x,&y
// 					);
// 				cvSetReal2D(map1,j,k,x);
// 				cvSetReal2D(map2,j,k,y);
// 			}
// 		}
// 		sprintf(name, "dcmap1mat%d.xml", i);
// 		cvSave(name, map1);
// 		sprintf(name, "dcmap2mat%d.xml", i);
// 		cvSave(name, map2);
// 		cvReleaseMat(&map1);
// 		cvReleaseMat(&map2);
// 	}
// }
// 
// int main(void)
// {
// // 	getDepthColorMapping();
// // 	return 0;
// 	//the camera must initialize here, or it can't setup resolution!!!
// 	capture = cvCaptureFromCAM(CV_CAP_DSHOW+1); // capture from video device #0
// 
// 	cvNamedWindow("aligned");
// 
// 	cvNamedWindow("depth");
// 	depthReadyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// // 	depthHandledEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// 	depthQuitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// 	cvNamedWindow("color");
// 	colorReadyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
//  	depthColorHandledEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// 	colorQuitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// 	CreateThread(NULL, 0, keepDepthColorData, NULL, 0, NULL);
// 
// 	cvNamedWindow("gray");
// 	grayReadyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// 	grayHandledEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// 	grayQuitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// 	CreateThread(NULL, 0, keepGrayData, NULL, 0, NULL);
// 
// 
// 	HANDLE handles[] = {depthReadyEvent, grayReadyEvent, colorReadyEvent};
// 	int handleNums = sizeof(handles) / sizeof(HANDLE);
// 
// 	WaitForMultipleObjects(handleNums, handles, TRUE, INFINITE);
// 	SetEvent(depthColorHandledEvent);
// 	SetEvent(grayHandledEvent);
// 
// 	while (!quit) {
// 		WaitForMultipleObjects(handleNums, handles, TRUE, INFINITE);
// 
// 		cvShowImage("depth", depthFrame);
// 		cvShowImage("gray", grayFrame);
// 		cvShowImage("color", colorFrame);
// 		SetEvent(depthColorHandledEvent);
// 		SetEvent(grayHandledEvent);
// 		char c = cvWaitKey(0);
// 		if (c == 13) {
// 			saveDCData = true;
// 			saveGData = true;
// 		}
// 		else {
// 			saveDCData = false;
// 			saveGData = false;
// 		}
// 		if (c == 27) quit = true;
// 	}
// 
// 	handles[0] = depthQuitEvent;
// 	handles[1] = grayQuitEvent;
// 	handles[2] = colorQuitEvent;
// 	SetEvent(depthColorHandledEvent);
// 	SetEvent(grayHandledEvent);
// 	WaitForMultipleObjects(handleNums, handles, TRUE, 5000);
// 
// 	return 0;
// }
